import scrapy
import time

import re
from ..items import ReptilePictureItem


def translate(num):
    # 10进制转16进制字符串
    num = str(hex(num))
    return num.replace("0x", "", 1)


def get_timestamp():
    # 获取当前时间戳字符串
    t = time.time()
    return str(int(round(t * 1000)))



class BookSpider(scrapy.Spider):
    # 爬虫名
    name = 'book'
    # 爬虫允许的爬取域名范围，最好根据你所要爬取的网站来确定，不能乱写，否则会搜索不到内容，使爬虫不受控制
    # allowed_domains = ['image.baidu.com','pic.quanjing.com','ai.qunapu.com','mvideopic.bdstatic.com']
    # 构建url的起始值offset，具体由网页分析后确定
    offset = 30
    current_offset = 30
    max_times = 200  # 测试时使用，限制最大爬取次数
    # 此处url的'https://'一定要写，不然会报错，而且不容易找出
    # url= 'https://image.baidu.com/search/acjson?tn=resultjson_com&word=%E7%8C%AA%E5%9C%88&ie=utf-8&fp=result&fr=&ala=0&applid=&pn={}&rn=30&nojc=0&gsm={}&newReq=1'
    url= 'https://image.baidu.com/search/acjson?tn=resultjson_com&word=%E6%B4%BB%E7%8C%AA&ie=utf-8&fp=result&fr=&ala=0&applid=&pn={}&rn=30&nojc=0&gsm={}&newReq=1'
    # url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8605576373647774920&ipn=rj&ct=201326592&is=&fp=result&fr=&word=%E5%AD%99%E5%85%81%E7%8F%A0&queryWord=%E5%AD%99%E5%85%81%E7%8F%A0&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&expermode=&nojc=&isAsync=&pn={}&rn=30&gsm={}&{}='
    # url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&word=%E7%8C%AA%E8%88%8D+%E7%85%A7%E7%89%87&ie=utf-8&fp=result&fr=&ala=0&applid=&pn={}&rn=30&nojc=0&gsm={}&newReq=1'

    # 起始url，列表内字符串的拼接
    start_urls = [url.format(str(current_offset), translate(current_offset))]

    def parse(self, response):

        # 使用scrapy shell 返回的内容为json格式，正则匹配出图片链接并提取
        pattern = re.compile(r'"objurl":"(.*?)",', re.S)
        # 此datas返回的是一个正则表达式列表，可迭代取出里面的url
        datas = re.findall(pattern, response.text)
        print(datas)
        print('-----------------------------')
        for data in datas:
            # 实例化item
            item = ReptilePictureItem()
            # print("图片链接是:", data)
            item['imageLink'] = data
            # 生成器，返回给pipelineItem文件
            # 由一个url获取一个图片的url列表,列表内有若干个图片链接url，依次获取发送图片链接的url，直至发送完，跳出循环
            yield item
        # 跳出循环后offset自增30（网页决定）
        self.current_offset = self.current_offset + self.offset

        if self.current_offset > 300:
            # 控制爬取次数，防止程序一直运行
            return
            # 调用此生成器，并发送下一个网页url，回调函数调用self.parse自身，再次循环处理列表中的图片链接url，循环往复获取图片
        yield scrapy.Request(self.url.format(str(self.current_offset), translate(self.current_offset)),
                             callback=self.parse)


